"""
循环语句 for 介绍
"""

# 1. 循环可迭代对象：字符串、列表、字典等。可以通过内置函数 dir 查看对象是否包含 _iter_ ，包含的话就是可迭代对象
# 可迭代
print(dir(str))
print(dir(list))
print(dir(dir))
print(dir(set))
# 不可迭代
print(dir(int))
print(dir(float))
# 字符串循环
for i in '23232323':
    print(i)
# 列表循环
l = [1, 2, 3, 4, 5, 6]
for i in l:
    print(i, i + 10)
# 元组循环
e = (1, 2, 3, 5, 6)
for i in e:
    print(i * 10)
# 字典循环
b_ = {'a': 1, 'b': 2}
for key in b_:
    print(key, b_[key])
# 如果需要循环得到字典中的键值对，可以使用 items() 方法
for k, v in b_.items():
    print(k, v)
# 集合循环
for s in {1, 3, 5, 7, 9}:
    print(s)

# 2. 小练习
# 生成 100 个 1 - 10 的随机数
import random
list1 = list()
for i in range(100):
    list1.append(random.randint(1, 10))
print(len(list1))
print(list1)
# 生成 100 个 1 - 10 的随机数，并统计每个生成的数出现次数
d = dict()
for i in range(100):
    randint = random.randint(1, 10)
    if randint in d:
        # 自增操作
        d[randint] += 1
    else:
        d[randint] = 1
print(d)

# 3. range 函数使用
print(help(range))
# 注意：使用 range 只有在使用的时候才会被读到内存中去
r = range(5)
print(type(r))
# 只有一个参数，即 stop 值，start 值隐藏了（默认是0），step 步长值隐藏了（默认是1）。注意：打印结果的起始和结束值
for i in range(5):
    print(i)
# 两个参数，即 start 值 和 stop 值，step 步长值隐藏了（默认是1）
for i in range(10, 16):
    print(i)
# 三个参数，即 start 值 和 stop 值，还有 step 步长值
for i in range(10, 20, 3):
    print(i)
# 使用 range 初始化列表
list2 = list(range(1, 10, 2))
print(list2)
# 得到 0 - 20 中能被 3 整除的数的列表
print(list(range(0, 20, 3)))

# 4. zip 函数使用。将两个迭代对象中的元素映射成元组形式的zip object
print(help(zip))
# 两个迭代对象等长
s1 = '123'
abc = 'abc'
iterator = zip(s1, abc)
print(type(iterator))
print(iterator)
print(list(iterator))
# 两个迭代对象不等长，以短的迭代对象为准
s2 = '123'
abcde = 'abcde'
zip1 = zip(s2, abcde)
print(type(zip1))
print(zip1)
print(list(zip1))
s3 = '12345'
abc1 = 'abc'
zip2 = zip(s3, abc1)
print(type(zip2))
print(zip2)
print(list(zip2))
# 两个不同类型的迭代对象
s4 = '123'
l1 = [1, '2', (1, 2, '3')]
zip3 = zip(s4, l1)
print(type(zip3))
print(zip3)
print(list(zip3))
# zip 的循环遍历
l2 = [1, 2, 3, 4, 5]
l3 = [11, 12, 13, 14, 15]
for a, b in zip(l2, l3):
    print(a + b)

# 4. enumerate 函数。得到可迭代对象中元素和索引的元组关系
print(help(enumerate))
l4 = ['1', 2, '3', 4]
enumerate1 = enumerate(l4)
print(type(enumerate1))
print(enumerate1)
print(list(enumerate1))
for a, b in enumerate1:
    print(a, b)
# 修改列表中元素值为偶数的元素的值为'修改值'
l5 = [1, 2, 3, 4, 5]
for a, b in enumerate(l5):
    if b % 2 == 0:
        l5[a] = '修改值'
print(l5)

# 5. 列表解析。常用于对空列表添加元素
# 使用 0 - 10 中值的平方初始化列表
range_ = [i ** 2 for i in range(10)]
print(range_)
# 得到 100 以内 能被 3 整除数的列表
i_ = [i for i in range(100) if i % 3 == 0]
print(i_)
in_range_ = [i for i in range(0, 100, 3)]
print(in_range_)
